// cookie：保存在客服端，容量<4k
// session：基于cookie实现，保存在服务端，容器~无限大
// 隐患：session劫持
// cookie可以向下访问，不可向上访问和访问同级目录

const express = require('express')  // 非破坏式中间件
const cookieParser = require('cookie-parser') // 中间件：读取cookie
const cookieSession = require('cookie-session') // 中间件：session
const cookieEncryption = require('cookie-encryption') // 中间件：加密cookie

let server = express()
server.listen(8080)
// #### 发送cookie
server.use('/a/a.html', cookieParser())  // 中间件：获取cookie
server.use('/a/a.html', (req, res) => {
  // 注入cookie
  res.cookie(
    'user', 'blue',
    {
      path: '/a', // 目录
      maxAge: 30 * 24 * 3600 * 1000 // 过期时间：30天
    }
  )
  console.log(req.cookies)  // 输出未签名的cookies
  res.send('a ok')
})

// 带签名的cookie
server.use('/b/b.html', cookieParser('asdfasdfasdfasdf'))  // 中间件：获取cookie,解密签名密钥
server.use('/b/b.html', (req, res) => {
  req.secret = 'asdfasdfasdfasdf' // 签名：防止篡改，也可以加，会从 cookieParser('asdfasdfasdfasdf') 获取
  res.cookie(
    'name', 'red',
    {
      path: '/b', // 目录
      signed: true  // 是否签名
    }
  )
  console.log('带签名的cookies：', req.signedCookies)
  console.log('不带签名的cookies：', req.cookies)
  res.send('b ok')
})

// #### 删除cookie
server.use('/c/c.html', (req, res) => {
  res.cookie('age', '12')
  res.clearCookie('age')  // 删除
  res.send('c ok')
})

// #### session
// session ID：不会改变
// session.sig 签名：每次都会改变
server.use('/d/d.html', cookieParser())
server.use('/d/d.html', cookieSession({
  name: 'num',  // 默认名为session，可自定义
  keys: ['asd', 'fgh', 'jkl'],  // cookieSession专属密码keys是个数据，循环使用非随机
  maxAge: 24 * 3600 * 1000  // 过期时间：1天
}))
server.use('/d/d.html', (req, res) => {
  // 记录用户登录次数
  if (req.session.count) {
    req.session.count++
  } else {
    req.session.count = 1
  }
  // delete req.session // 删除session
  console.log(req.session)
  res.send('d ok')
})
